package bean;


import java.util.Calendar;

import lang.AbstractDate;
import exception.JAFRuntimeException;

/**
 * <描述>时间戳，默认格式为yyyy-MM-dd HH:mm:ss.SSS
 * 
 * @author 王永弟
 * @since JDK1.4
 * @copyright 广州从兴电子开发有限公司-电子渠道业务部
 * @date 2011-5-1
 */
public class Timestamp extends AbstractDate {
	private static final long serialVersionUID = 1L;
	/**
	 * 默认的日期格式
	 */
	private static final String DEFAULT_FORMATTER = "yyyy-MM-dd HH:mm:ss.SSS";

	/**
	 * <构造函数> 实例化时间戳，默认赋值系统时间戳
	 */
	public Timestamp() {
		super.setFormatter(DEFAULT_FORMATTER);
	}

	/**
	 * <构造函数> 根据指定的年/月/日实例化当前时间戳，时间值则为00:00:00.000
	 * 
	 * @param year
	 *            年
	 * @param month
	 *            月 1-12
	 * @param day
	 *            日 1-31
	 */
	public Timestamp(int year, int month, int day) {
		super.setFormatter(DEFAULT_FORMATTER);
		cal.set(year, month, day, 0, 0, 0);
		cal.set(Calendar.MILLISECOND, 0);
	}

	/**
	 * <构造函数>根据指定的年/月/日/小时/分钟/秒实例化当前时间戳，毫秒值为0
	 * 
	 * @param year
	 *            年
	 * @param month
	 *            月 1-12
	 * @param day
	 *            日 1-31
	 * @param hour
	 *            小时 0-23
	 * @param minute
	 *            分钟 0-59
	 * @param second
	 *            秒 0-59
	 */
	public Timestamp(int year, int month, int day, int hour, int minute, int second) {
		super.setFormatter(DEFAULT_FORMATTER);
		cal.set(year, month, day, hour, minute, second);
		cal.set(Calendar.MILLISECOND, 0);
	}

	/**
	 * <构造函数>根据指定的年/月/日/小时/分钟/秒/毫秒实例化当前时间戳
	 * 
	 * @param year
	 *            年
	 * @param month
	 *            月 1-12
	 * @param day
	 *            日 1-31
	 * @param hour
	 *            小时 0-23
	 * @param minute
	 *            分钟 0-59
	 * @param second
	 *            秒 0-59
	 * @param milliSecond
	 *            毫秒值 0-999
	 */
	public Timestamp(int year, int month, int day, int hour, int minute, int second, int milliSecond) {
		super.setFormatter(DEFAULT_FORMATTER);
		cal.set(year, month, day, hour, minute, second);
		cal.set(Calendar.MILLISECOND, milliSecond);
	}

	/**
	 * 根据毫秒数实例化当前时间戳
	 * <构造函数>
	 * 
	 * @param milliseconds
	 *            毫秒数
	 */
	public Timestamp(long milliseconds) {
		setTime(milliseconds);
	}

	@Override
	public void setTime(long milliseconds) {
		cal.setTimeInMillis(milliseconds);
		super.setFormatter(DEFAULT_FORMATTER);
	}

	/**
	 * <方法描述> 获取天，在一个月中的天数，1-31
	 * 
	 * @return 天数
	 */
	public int getDay() {
		return cal.get(Calendar.DAY_OF_MONTH);
	}

	/**
	 * <方法描述> 获取天数，在本周中的天数，1-7，默认星期日为一周的第一天
	 * 
	 * @return 天数
	 */
	public int getDayOfWeek() {
		return cal.get(Calendar.DAY_OF_WEEK);
	}

	/**
	 * <方法描述> 获取天数，在一年中的天数，1-365
	 * 
	 * @return 天数
	 */
	public int getDayOfYear() {
		return cal.get(Calendar.DAY_OF_YEAR);
	}

	/**
	 * <方法描述> 获取月份 1-12
	 * 
	 * @return 月份
	 */
	public int getMonth() {
		return cal.get(Calendar.MONTH) + 1;
	}

	/**
	 * 获取周数，在本月中的周数，1-5
	 * <方法描述>
	 * 
	 * @return 周
	 */
	public int getWeekOfMonth() {
		return cal.get(Calendar.WEEK_OF_MONTH);
	}

	/**
	 * <方法描述> 获取周数，在本年中的周数，1-53
	 * 
	 * @return 周数
	 */
	public int getWeekOfYear() {
		return cal.get(Calendar.WEEK_OF_YEAR);
	}

	/**
	 * <方法描述> 获取年数，四位的年份，yyyy
	 * 
	 * @return 年份
	 */
	public int getYear() {
		return cal.get(Calendar.YEAR);
	}

	/**
	 * <方法描述> 获取小时，为24小时日期格式，0-23
	 * 
	 * @return 小时
	 */
	public int getHour() {
		return cal.get(Calendar.HOUR_OF_DAY);
	}

	/**
	 * <方法描述> 获取分钟数，0-59
	 * 
	 * @return 分钟
	 */
	public int getMinute() {
		return cal.get(Calendar.MINUTE);
	}

	/**
	 * <方法描述> 获取秒数，0-59
	 * 
	 * @return 秒
	 */
	public int getSecond() {
		return cal.get(Calendar.SECOND);
	}

	/**
	 * <方法描述> 年份操作，可增加或减少年份
	 * 
	 * @param year
	 *            负数为减少，正数为增加
	 */
	public void addYear(int year) {
		cal.add(Calendar.YEAR, year);
	}

	/**
	 * <方法描述> 月份操作，可增加或减少月份
	 * 
	 * @param month
	 *            负数为减少，正数为增加
	 */
	public void addMonth(int month) {
		cal.add(Calendar.MONTH, month);
	}

	/**
	 * <方法描述> 日期操作，可增加或减少天数
	 * 
	 * @param day
	 *            负数为减少，正数为增加
	 */
	public void addDay(int day) {
		cal.add(Calendar.DATE, day);
	}

	/**
	 * <方法描述> 时间操作，可增加或减少小时数
	 * 
	 * @param hour
	 *            负数为减少，正数为增加
	 */
	public void addHour(int hour) {
		cal.add(Calendar.HOUR_OF_DAY, hour);
	}

	/**
	 * <方法描述> 分钟操作，可增加或减少分钟
	 * 
	 * @param minute
	 *            负数为减少，正数为增加
	 */
	public void addMinute(int minute) {
		cal.add(Calendar.MINUTE, minute);
	}

	/**
	 * <方法描述> 日期操作，可增加或减少秒
	 * 
	 * @param second
	 *            负数为减少，正数为增加
	 */
	public void addSecond(int second) {
		cal.add(Calendar.SECOND, second);
	}

	/**
	 * <方法描述> 修改年份，四位的年份，yyyy
	 * 
	 * @param year
	 *            四位的年份
	 */
	public void setYear(int year) {
		cal.set(Calendar.YEAR, year);
	}

	/**
	 * <方法描述> 修改月份，1-2位的月份，值为1-12
	 * 
	 * @param month
	 *            月份
	 */
	public void setMonth(int month) {
		cal.set(Calendar.MONTH, month - 1);
	}

	/**
	 * <方法描述> 修改天数，值为1-31
	 * 
	 * @param day
	 *            天数
	 */
	public void setDay(int day) {
		cal.set(Calendar.DATE, day);
	}

	/**
	 * <方法描述> 修改小时数，值为0-23
	 * 
	 * @param hour
	 *            小时数
	 */
	public void setHour(int hour) {
		cal.set(Calendar.HOUR_OF_DAY, hour);
	}

	/**
	 * <方法描述> 修改分钟数，值为0-59
	 * 
	 * @param minute
	 *            分钟数
	 */
	public void setMinute(int minute) {
		cal.set(Calendar.MINUTE, minute);
	}

	/**
	 * <方法描述> 修改秒数，值为0-59
	 * 
	 * @param second
	 *            秒数
	 */
	public void setSecond(int second) {
		cal.set(Calendar.SECOND, second);
	}

	/**
	 * <方法描述> 将指定的字符串，根据指定格式，转化为时间戳
	 * 
	 * @param str
	 *            时间戳字符串
	 * @param formatter
	 *            时间戳对应的格式
	 * @return 时间戳对象
	 * @throws JAFRuntimeException
	 *             无法转换时抛出
	 */
	public static Timestamp parse(String str, String formatter) {
		return AbstractDate.parse(str, formatter, Timestamp.class);
	}

	/**
	 * <方法描述> 将指定的字符串，根据默认的格式"yyyy-MM-dd HH:mm:ss.SSS"，转化为时间戳
	 * 
	 * @param str
	 *            时间戳字符串
	 * @return 时间戳对象
	 * @throws JAFRuntimeException
	 *             无法转换时抛出
	 */
	public static Timestamp parse(String str) {
		return AbstractDate.parse(str, DEFAULT_FORMATTER, Timestamp.class);
	}
}

